#ifndef SIMPLE_SUPPORT_META_PEND_HPP
#define SIMPLE_SUPPORT_META_PEND_HPP

namespace simple::support::meta
{

	template <typename List, typename... Ts>
	struct append;

	template <template <typename...> typename List, typename... First, typename... Last>
	struct append<List<First...>, Last...>
	{
		using type = List<First..., Last...>;
	};

	template <typename List, typename... Ts>
	using append_t = typename append<List,Ts...>::type;

	template <typename List, typename... Ts>
	struct prepend;

	template <template <typename...> typename List, typename... First, typename... Last>
	struct prepend<List<First...>, Last...>
	{
		using type = List<Last..., First...>;
	};

	template <typename List, typename... Ts>
	using prepend_t = typename prepend<List,Ts...>::type;

	template <typename L1, typename L2>
	struct concat;

	template <template <typename...> class List,
		template <typename...> class List2,
		typename... First, typename... Last>
	struct concat<List<First...>, List2<Last...>>
	{
		using type = List<First..., Last...>;
	};

	template <typename L1, typename L2>
	using concat_t = typename concat<L1,L2>::type;


} // namespace simple::support::meta

#endif /* end of include guard */
